﻿using System;
using System.Windows.Forms;
using Company.BLL;
using Company.BLL.KDT.SXXK;
using Janus.Windows.GridEX;
using Janus.Windows.UI.CommandBars;
using InheritableBoolean = Janus.Windows.UI.InheritableBoolean;
using Company.BLL.KDT;

namespace Company.Interface.KDT.SXXK
{
    public partial class SanPhamManageForm : BaseForm
    {
        /// <summary>
        /// Dùng cho kết quả tìm kiếm.
        /// </summary>
        private SanPhamDangKyCollection spDangKyCollection = new SanPhamDangKyCollection();

        /// <summary>
        /// Thông tin sản phẩm đang dược chọn.
        /// </summary>
        private readonly SanPhamDangKy currentSPDangKy = new SanPhamDangKy();


        public SanPhamManageForm()
        {
            InitializeComponent();
        }

        //-----------------------------------------------------------------------------------------
        private void SanPhamManageForm_Load(object sender, EventArgs e)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                ctrDonViHaiQuan.Ma = GlobalSettings.MA_HAI_QUAN;

                cbStatus.SelectedIndex = 0;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }

        //-----------------------------------------------------------------------------------------

        private void btnSearch_Click(object sender, EventArgs e)
        {
            this.search();
        }

        //-----------------------------------------------------------------------------------------
        /// <summary>
        /// Tìm kiếm dữ liệu.
        /// </summary>
        private void search()
        {
            // Xây dựng điều kiện tìm kiếm.
            string where = "1 = 1";
            where += string.Format(" AND MaHaiQuan = '{0}'", ctrDonViHaiQuan.Ma);

            if (txtSoTiepNhan.TextLength > 0)
            {
                where += " AND SoTiepNhan = " + txtSoTiepNhan.Value;
            }

            if (Convert.ToInt32(cbStatus.SelectedValue) != TrangThaiXuLy.CHUA_KHAI_BAO)
            {
                if (txtNamTiepNhan.TextLength > 0)
                {
                    where += " AND YEAR(NgayTiepNhan) = " + txtNamTiepNhan.Value;
                }
            }

            where += " AND TrangThaiXuLy = " + cbStatus.SelectedValue;

            // Thực hiện tìm kiếm.            
            this.spDangKyCollection = SanPhamDangKy.SelectCollectionDynamic(where, "");
            dgList.DataSource = this.spDangKyCollection;

            this.setCommandStatus();

            this.currentSPDangKy.TrangThaiXuLy = Convert.ToInt32(cbStatus.SelectedValue);
        }

        //-----------------------------------------------------------------------------------------

        private void setCommandStatus()
        {
            dgList.AllowDelete = Janus.Windows.GridEX.InheritableBoolean.True;
            if (Convert.ToInt32(cbStatus.SelectedValue) == TrangThaiXuLy.CHO_DUYET)
            {
                dgList.RootTable.Columns["SoTiepNhan"].Visible = true;
                dgList.RootTable.Columns["NgayTiepNhan"].Visible = true;
                cmdSend.Enabled = InheritableBoolean.False;
                cmdSingleDownload.Enabled = InheritableBoolean.True;
                cmdCancel.Enabled = InheritableBoolean.True;
            }
            else if (Convert.ToInt32(cbStatus.SelectedValue) == TrangThaiXuLy.DA_DUYET)
            {
                dgList.RootTable.Columns["SoTiepNhan"].Visible = true;
                dgList.RootTable.Columns["NgayTiepNhan"].Visible = true;
                cmdSend.Enabled = InheritableBoolean.False;
                cmdSingleDownload.Enabled = InheritableBoolean.False;
                cmdCancel.Enabled = InheritableBoolean.False;
                dgList.AllowDelete = Janus.Windows.GridEX.InheritableBoolean.False;
            }
            else if (Convert.ToInt32(cbStatus.SelectedValue) == TrangThaiXuLy.CHUA_KHAI_BAO)
            {
                dgList.RootTable.Columns["SoTiepNhan"].Visible = false;
                dgList.RootTable.Columns["NgayTiepNhan"].Visible = false;
                cmdSend.Enabled = InheritableBoolean.True;
                cmdSingleDownload.Enabled = InheritableBoolean.False;
                cmdCancel.Enabled = InheritableBoolean.False;
            }
            else if (Convert.ToInt32(cbStatus.SelectedValue) == TrangThaiXuLy.KHONG_PHE_DUYET)
            {
                dgList.RootTable.Columns["SoTiepNhan"].Visible = true;
                dgList.RootTable.Columns["NgayTiepNhan"].Visible = true;
                cmdSend.Enabled = InheritableBoolean.True;
                cmdSingleDownload.Enabled = InheritableBoolean.False;
                cmdCancel.Enabled = InheritableBoolean.True;
            }
        }


        private void dgList_LoadingRow(object sender, RowLoadEventArgs e)
        {
            if (e.Row.RowType == RowType.Record)
            {
                e.Row.Cells["TenHaiQuan"].Text = this.DonViHaiQuan_GetName(e.Row.Cells["MaHaiQuan"].Value.ToString().Trim());
                switch (Convert.ToInt32(e.Row.Cells["TrangThaiXuLy"].Value))
                {
                    case -1:
                        e.Row.Cells["TrangThaiXuLy"].Text = "Chưa khai báo";
                        break;
                    case 0:
                        e.Row.Cells["TrangThaiXuLy"].Text = "Chờ duyệt";
                        break;
                    case 1:
                        e.Row.Cells["TrangThaiXuLy"].Text = "Đã duyệt";
                        break;
                    case 2:
                        e.Row.Cells["TrangThaiXuLy"].Text = "Không phê duyệt";
                        break;
                }
            }
        }

        //-----------------------------------------------------------------------------------------

        private void download()
        {
            SanPhamDangKy spDK = new SanPhamDangKy();
            try
            {
                this.Cursor = Cursors.WaitCursor;
                GridEXSelectedItemCollection items = dgList.SelectedItems;
                foreach (GridEXSelectedItem i in items)
                {
                    if (i.RowType == RowType.Record)
                    {
                        spDK = (SanPhamDangKy)i.GetRow().DataRow;

                        int ttxl = spDK.TrangThaiXuLy;

                        WSForm wsForm = new WSForm();
                        wsForm.ShowDialog(this);
                        if (!wsForm.IsReady) return;

                        spDK.WSRequestStatus();

                        if (spDK.TrangThaiXuLy == TrangThaiXuLy.DA_DUYET)
                        {
                            ShowMessage("Nhận dữ liệu thành công! \nTrạng thái chứng từ đã thay đổi: Đã duyệt chính thức.", false);
                            this.search();
                        }
                        else if (spDK.TrangThaiXuLy==TrangThaiXuLy.CHO_DUYET)
                        {
                            ShowMessage("Nhận dữ liệu thành công!", false);
                            dgList.Refetch();
                        }
                        else if (spDK.TrangThaiXuLy == TrangThaiXuLy.KHONG_PHE_DUYET)
                        {
                            ShowMessage("Nhận dữ liệu thành công! \nTrạng thái chứng từ đã thay đổi: Hải quan không phê duyệt.", false);
                            this.search();
                        }
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                if (ShowMessage("Nhận dữ liệu không thành công.\nLỗi: " + ex.Message + ".\nBạn có muốn đưa vào hàng đợi không?", true) == "Yes")
                {
                    HangDoi hd = new HangDoi();
                    hd.ID = spDK.ID;
                    hd.LoaiToKhai = LoaiToKhai.DANH_MUC_SAN_PHAM;
                    hd.TrangThai = spDK.TrangThaiXuLy;
                    hd.ChucNang = ChucNang.NHAN_THONG_TIN;
                    MainForm.AddToQueueForm(hd);
                    MainForm.ShowQueueForm();
                }
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }

        //-----------------------------------------------------------------------------------------

        private void cmMain_CommandClick(object sender, CommandEventArgs e)
        {
            switch (e.Command.Key)
            {
                case "cmdSingleDownload":
                    this.download();
                    break;
                case "cmdCancel":
                    this.cancel();
                    break;
                case "cmdSend":
                    this.send();
                    break;
            }
        }

        //-----------------------------------------------------------------------------------------

        private void dgList_RowDoubleClick(object sender, RowActionEventArgs e)
        {
            if (e.Row.RowType == RowType.Record)
            {
                SanPhamDangKyDetailForm f = new SanPhamDangKyDetailForm();
                f.SPDangKy = (SanPhamDangKy)e.Row.DataRow;
                // int ttxl = f.SPDangKy.TrangThaiXuLy;
                if (f.SPDangKy.TrangThaiXuLy == TrangThaiXuLy.CHUA_KHAI_BAO || f.SPDangKy.TrangThaiXuLy == TrangThaiXuLy.KHONG_PHE_DUYET)
                {
                    f.OpenType = OpenFormType.Edit;
                }
                else
                {
                    f.OpenType = OpenFormType.View;
                }
                f.ShowDialog(this);
                // if (ttxl != f.SPDangKy.TrangThaiXuLy) this.search();
            }
        }

        /// <summary>
        /// Hủy thông tin đã đăng ký.
        /// </summary>
        private void cancel()
        {
            SanPhamDangKy spDangKy = new SanPhamDangKy();
            try
            {
                this.Cursor = Cursors.WaitCursor;
                if (dgList.GetRow() != null)
                {
                    spDangKy = (SanPhamDangKy)dgList.GetRow().DataRow;
                    if (spDangKy.TrangThaiXuLy == TrangThaiXuLy.CHO_DUYET || spDangKy.TrangThaiXuLy == TrangThaiXuLy.KHONG_PHE_DUYET)
                    {
                        WSForm wsForm = new WSForm();
                        wsForm.ShowDialog(this);
                        if (!wsForm.IsReady) return;

                        bool result = spDangKy.WSCancel();
                        if (result)
                        {
                            ShowMessage("Hủy thông tin đã đăng ký thành công!", false);
                            this.search();
                        }
                        else
                        {
                            ShowMessage("Hủy thông tin đã đăng ký không thành công!", false);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (ShowMessage("Hủy khai báo không thành công.\nLỗi: " + ex.Message + ".\nBạn có muốn đưa vào hàng đợi không?", true) == "Yes")
                {
                    HangDoi hd = new HangDoi();
                    hd.ID = spDangKy.ID;
                    hd.LoaiToKhai = LoaiToKhai.DANH_MUC_SAN_PHAM;
                    hd.TrangThai = spDangKy.TrangThaiXuLy;
                    hd.ChucNang = ChucNang.HUY_KHAI_BAO;
                    MainForm.AddToQueueForm(hd);
                    MainForm.ShowQueueForm();
                }
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }

        /// <summary>
        /// Gửi thông tin đăng ký đến Hải quan.
        /// </summary>
        private void send()
        {
            SanPhamDangKy spDangKy = new SanPhamDangKy();
            try
            {
                
                if (dgList.GetRow() != null)
                {
                    spDangKy = (SanPhamDangKy)dgList.GetRow().DataRow;
                    spDangKy.LoadSPCollection();
                    if (spDangKy.SPCollection.Count == 0)
                    {
                        ShowMessage("Danh sách sản phẩm rỗng.\nKhông thể thực hiện khai báo thông tin đến Hải quan.", false);
                        this.Cursor = Cursors.Default;
                        return;
                    }

                    string[] danhsachDaDangKy = new string[0];

                    WSForm wsForm = new WSForm();
                    wsForm.ShowDialog(this);
                    if (!wsForm.IsReady) return;
                    this.Cursor = Cursors.WaitCursor;
                    spDangKy.WSSend(ref danhsachDaDangKy);
                    this.Cursor = Cursors.Default;
                    // Thực hiện kiểm tra.
                    if (spDangKy.SoTiepNhan == 0)
                    {
                        //this.updateRowsOnGrid(danhsachDaDangKy);
                        ShowMessage("Đăng ký không thành công!\nDo có các sản phẩm đã được đăng ký rồi.\nVui lòng kiểm tra lại các dòng màu đỏ!", false);
                    }
                    else
                    {
                        ShowMessage("Đăng ký thành công!\nSố tiếp nhận đăng ký điện tử: " + spDangKy.SoTiepNhan, false);
                        //cmdAdd.Enabled = cmdSend.Enabled = InheritableBoolean.False;
                    }
                    this.search();
                }
            }
            catch (Exception ex)
            {
                this.Cursor = Cursors.Default;
                if (ex.Message.IndexOf("123DaDuyet321") >= 0)
                {
                    ShowMessage("Danh sách này đã duyệt rồi ", false);
                    return;
                }
                if (ShowMessage("Khai báo không thành công.\nLỗi: " + ex.Message + ".\nBạn có muốn đưa vào hàng đợi không?", true) == "Yes")
                {
                    HangDoi hd = new HangDoi();
                    hd.ID = spDangKy.ID;
                    hd.LoaiToKhai = LoaiToKhai.DANH_MUC_SAN_PHAM;
                    hd.TrangThai = spDangKy.TrangThaiXuLy;
                    hd.ChucNang = ChucNang.KHAI_BAO;
                    MainForm.AddToQueueForm(hd);
                    MainForm.ShowQueueForm();
                }
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }

        //-----------------------------------------------------------------------------------------

        private void cbStatus_SelectedValueChanged(object sender, EventArgs e)
        {         
            if (Convert.ToInt32(cbStatus.SelectedValue) == TrangThaiXuLy.CHUA_KHAI_BAO)
            {
                txtNamTiepNhan.Text = string.Empty;
                txtNamTiepNhan.Value = 0;
                txtNamTiepNhan.Enabled = false;
                txtSoTiepNhan.Value = 0;
                txtSoTiepNhan.Text = string.Empty;
                txtSoTiepNhan.Enabled = false;
            }
            else
            {
                txtNamTiepNhan.Value = DateTime.Today.Year;
                txtNamTiepNhan.Enabled = true;
                txtSoTiepNhan.Enabled = true;
            }
            
        }

        //-----------------------------------------------------------------------------------------

        private void dgList_DeletingRecord(object sender, RowActionCancelEventArgs e)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                if (e.Row.RowType == RowType.Record)
                {
                    SanPhamDangKy spDangKySelected = (SanPhamDangKy)e.Row.DataRow;
                    if (spDangKySelected.TrangThaiXuLy == TrangThaiXuLy.CHUA_KHAI_BAO)
                    {
                        if (ShowMessage("Bạn có muốn xóa thông tin đăng ký này và các sản phẩm liên quan không?", true) == "Yes")
                        {
                            spDangKySelected.Delete();
                        }
                        else
                        {
                            e.Cancel = true;
                        }
                    }
                    else if (spDangKySelected.TrangThaiXuLy == TrangThaiXuLy.CHO_DUYET)
                    {
                        if (ShowMessage("Bạn có muốn xóa thông tin đăng ký này và các sản phẩm liên quan không?\nĐồng thời sẽ đồng bộ dữ liệu với Hải quan (yêu cầu kết nối đến Hải quan).", true) == "Yes")
                        {
                            spDangKySelected.LoadSPCollection();
                            WSForm wsForm = new WSForm();
                            wsForm.ShowDialog(this);
                            if (!wsForm.IsReady) return;
                            if (spDangKySelected.WSCancel())
                            {
                                spDangKySelected.Delete();
                            }
                            else
                            {
                                if (ShowMessage("Không thể thực hiện thao tác xóa thông tin.\nCó thể thông tin này không tồn tại ở Hải quan.\nNhư vậy, bạn có muốn xóa khỏi CSDL không?", true) == "Yes")
                                {
                                    spDangKySelected.Delete();
                                }
                                else
                                {
                                    e.Cancel = true;
                                }
                            }
                        }
                        else
                        {
                            e.Cancel = true;
                        }
                    }
                    else
                    {
                        e.Cancel = true;
                    }
                }
            }
            catch (Exception ex)
            {
                ShowMessage(ex.Message, false);
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }

        private void SanPhamManageForm_Shown(object sender, EventArgs e)
        {
            this.search();
        }

        private void dgList_DeletingRecords(object sender, System.ComponentModel.CancelEventArgs e)
        {
            try
            {
                if (ShowMessage("Bạn có muốn xóa danh sách sản phẩm này không?", true) == "Yes")
                {
                    this.Cursor = Cursors.WaitCursor;
                    GridEXSelectedItemCollection items = dgList.SelectedItems;
                    foreach (GridEXSelectedItem i in items)
                    {
                        if (i.RowType == RowType.Record)
                        {
                            SanPhamDangKy spDangKySelected = (SanPhamDangKy)i.GetRow().DataRow;
                            if (spDangKySelected.ID > 0)
                            {
                                spDangKySelected.Delete();
                            }
                        }
                    }
                }
                else
                {
                    e.Cancel = true;
                }
            }
            catch (Exception ex)
            {
                ShowMessage(ex.Message, false);
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }

        }

        //-----------------------------------------------------------------------------------------
    }
}